package com.paramland.iam.auth.web;

import org.hilo.boot.core.AMSG;

/**
 * CODE定义风格自由，一般有三种方式：
 * 
 * <pre>{@code

风格1：眯着眼睛随便敲4~6个随机字母/数字：
    KFDJG1("无效ticket：{}")
    FGD08F("菜单URL不能为空")

风格2：英文或拼音大写字母
    PASSWD_INVALID("手机号或密码错误"),
    TOKEN_INVALID("token失效，请重新登录"),

风格3：自定义数字
    QX_EMPTY_CERID("100701", "证件号码为空"),
    QX_EMPTY_NAME("100702", "名称为空"),

 * }</pre>
 * 
 * <p>第一种写代码的人最爽，第二种看代码的人最爽，第三种只为了适配某些特殊规范。
 * 
 * <pre>{@code

每个CODE建议`只使用一次，不要在多处代码使用`。 
当有多处需要使用相同信息时，可以引用，例如：
    KFDJG1("无效ticket：{}"),
    KFDJG2(KFDJG1.getMsg()),
    KFDJG3(KFDJG1.getMsg()),
    KFDJG4(KFDJG1.getMsg()),
遵循这个建议会让你在根据错误信息排查程序逻辑时提供最好的帮助。
例如，客户告诉你，她登录报错：“code = KFDJG3， msg = 无效ticket：a9e8d98c9e9d”
因为每个code在代码中只有一处使用，所以根据code = KFDJG3即可直接定位到报错的代码行！！
 * }</pre>
 * 
 * <p>注意，这里只解决了信息的定义及代码关联问题。没有解决运行时错误日志及上下文定位问题。
 * <p>在分布式系统中，要解决运行时错误日志及上下文定位问题，还需要RefMsg.java这个类，
 * <p>它的作用是将某次报错的错误日志信息做一个编码，例如imYn2e-051310381，这个编码是服务器唯一的。
 * <p>根据前6位“imYn2e”可以定位服务器，根据后面几位（ddHHmmssS格式）可以定位时间和日志位置。
 * <p>因为时间到了毫秒，所以直接搜索日志一般就能定位到准确的日志位置。RefMsg一般和日志异常记录一同使用。
 * 
 * @author zollty
 * @since 2023年7月21日
 */
public enum MsgAccount implements AMSG {
    
    // QX_开头 -- QIXIN相关的错误信息
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    QX_EMPTY_CERTID("100701", "证件号码为空"),
    QX_EMPTY_CUSTOMERNAME("100702", "名称为空"),
    
    // USR开头 -- User相关的错误信息（code自动生成）
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /** 手机号或密码错误 */
    USR_PASSWD_INVALID("手机号或密码错误"),
    /** 新密码不为能空 */
    USR_NEW_PASSWD_EMPTY("新密码不为能空"),
    /** 手机号不能为空 */
    USR_MOBILE_EMPTY("手机号不能为空"),
    /** 密码不能为空 */
    USR_PASSWD_EMPTY("密码不能为空"),
    
    // MENU开头 -- Menu相关的错误信息
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /** 菜单名称不能为空 */
    MENU_NAME_EMPTY("菜单名称不能为空"),
    /** 上级菜单不能为空 */
    MENU_PARENT_EMPTY("上级菜单不能为空"),
    /** 菜单URL不能为空 */
    MENU_URL_EMPTY("菜单URL不能为空"),
    /** 上级菜单只能为目录类型 */
    MENU_PARENT_ONLY_BE_DIR("上级菜单只能为目录类型"),
    /** 上级菜单只能为菜单类型 */
    MENU_PARENT_ONLY_BE_MENU("上级菜单只能为菜单类型"),
    
    // TOKEN开头 -- Token相关的错误信息
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /** token失效，请重新登录 */
    TOKEN_INVALID("token失效，请重新登录"),
    
    
    
    
    ;

    MsgAccount(String info) {
        me(info);
    }

    MsgAccount(String code, String info) {
        me(info);
    }
    
    @Override
    public String toString(){
        return getCode() + "=[" + this.name() + "] " + getMsg();
    }
}


